import os
import time
import logging
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException, StaleElementReferenceException

# Configure logging
logging.basicConfig(filename='selenium.log', level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')

def write_to_file(file, content):
    """Write content to a file."""
    try:
        file.write(content)
    except Exception as e:
        logging.error(f"Error writing to file: {e}")

def navigate_categories(driver, selector, path, depth=0, file=None):
    """Navigate through categories using a path of indices."""
    try:
        if depth < len(path):
            start_index = path[depth]
        else:
            start_index = 0

        category_elements = WebDriverWait(driver, 30).until(
            EC.presence_of_all_elements_located((By.CSS_SELECTOR, selector))
        )
        for index in range(start_index, len(category_elements)):
            category_elements = WebDriverWait(driver, 30).until(
                EC.presence_of_all_elements_located((By.CSS_SELECTOR, selector))
            )
            elem = category_elements[index]
            category_name = elem.text.strip()
            category_url = elem.get_attribute('href')
            indent = "  " * depth
            write_to_file(file, f"{indent}Category: {category_name}\n{indent}URL: {category_url if category_url else 'Not Available'}\n")
            print(f"Processing category {index+1} of {len(category_elements)} at depth {depth}: {category_name}")

            elem.click()
            if is_documents_page(driver):
                navigate_document_page(driver, file, depth + 1)
            else:
                navigate_categories(driver, selector, path, depth + 1, file)

            driver.back()
            time.sleep(2)
    except StaleElementReferenceException as e:
        logging.error(f"StaleElementReferenceException caught: {e}")
        navigate_categories(driver, selector, path, depth, file)  # Restart from the last index
    except TimeoutException as e:
        logging.error(f"TimeoutException caught: {e}")

def is_documents_page(driver):
    """Check if the current page is a documents page."""
    try:
        documents_heading = WebDriverWait(driver, 30).until(
            EC.presence_of_element_located((By.CSS_SELECTOR, 'p.text-base.font-semibold.sm\\:text-xl'))
        )
        return 'Documents' in documents_heading.text
    except TimeoutException:
        return False

def navigate_document_page(driver, file, depth):
    """Navigate through the document page and write document names to file."""
    document_elements = WebDriverWait(driver, 30).until(
        EC.presence_of_all_elements_located((By.CSS_SELECTOR, 'td.p-3.flex-1.text-ellipsis.overflow-auto'))
    )
    for document_element in document_elements:
        document_name = document_element.text.strip()
        if document_name:
            write_to_file(file, f"{depth * '  '}{document_name}\n")

# WebDriver setup and main execution flow
driver = webdriver.Chrome()
driver.get('https://www.dpiarchive.com/#/login')

try:
    WebDriverWait(driver, 30).until(EC.visibility_of_element_located((By.ID, 'email'))).send_keys('isaackoi@gmail.com')
    WebDriverWait(driver, 30).until(EC.visibility_of_element_located((By.ID, 'password'))).send_keys('INSERTPASSWORD')
    WebDriverWait(driver, 30).until(EC.element_to_be_clickable((By.XPATH, "//button[contains(text(), 'Login')]"))).click()

    selector = '.w-full.text-zinc-900.p-2.text-center.opacity-100.group-hover\\:opacity-75.transition-opacity.duration-300'
    path_input = input("Enter path indices separated by commas (e.g., 0,0 for the start): ")
    path = [int(x.strip()) for x in path_input.split(',')] if path_input else []
    with open('category_descriptions.txt', 'w') as file:
        navigate_categories(driver, selector, path, 0, file)
finally:
    driver.quit()
    input("Press Enter to close...")
